package com.itheima;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Random;
import java.util.Scanner;

/**
    实现客户端的开发
    客户端有两个功能:
        1.客户端可以收到服务端发送的各种消息,并打印
        2.客户端发送各种消息给服务端

    客户端和服务端消息通信规则约定(简称通信码):
         100: 表示登陆
         101: 表示注册

         200: 表示单聊
         201: 表示群聊
         202: 表示随机聊

         300: 客户端获取已上线的所有用户
         301: 客户端获取上线用户根据用户名升序排序
         302: 客户端获取指定性别的上线用户

         举例:客户端给服务端发送100,表示客户端要进行登录操作
 */
public class ChatClient {

    public static void main(String[] args) {
        try {
            Scanner sc = new Scanner(System.in);
            //System.out.println("请输服务端IP：");
            //String ip = sc.nextLine();

            // 1.创建于服务端的Socket,并保存到成员变量
            Socket socket = new Socket("127.0.0.1", 9999);
            System.out.println("连接服务器成功!");
            // 2.分配一个线程为客户端socket服务接收服务端发来的消息
            new ChatClientReaderThread(socket).start();

            // 获取Socket的输出流转成打印流,方便一次打印一行数据
            PrintStream ps = new PrintStream(socket.getOutputStream());

            // 用户可以循环操作
            while (true) {
                // 3.打印操作信息
                System.out.println("1.登陆");
                System.out.println("2.注册");
                System.out.println("3.单聊");
                System.out.println("4.群聊");
                System.out.println("5.随机聊");
                System.out.println("6.获取上线用户根据用户名升序排序");
                System.out.println("7.获取指定性别的上线用户");
                System.out.println("8.获取已上线的所有用户");
                System.out.println("9.退出");
                System.out.println("请输入你的选择：");

                // 4.使用Scanner进行键盘输入
                String operation = sc.nextLine();
                // 判断消息类型
                switch (operation) {
                    case "1": // 1.表示登陆
                        login(ps);
                        break;
                    case "2": // 2.表示注册
                        register(ps);
                        break;
                    case "3": // 3.表示单聊
                        sendOne(ps);
                        break;
                    case "4": // 4.表示群聊
                        sendAll(ps);
                        break;
                    case "5": // 5.表示随机聊
                        sendRandom(ps);
                        break;
                    case "6": // 6.获取上线用户根据用户名升序排序
                        getOnlineUserAscByUsername(ps);
                        break;
                    case "7": // 7.获取指定性别的上线用户
                        getOnlineUserBySex(ps);
                        break;
                    case "8": // 8.获取已上线的所有用户
                        getAllOnlineUser(ps);
                        break;
                    case "9": // 9.退出
                        break;
                    default:
                        System.out.println("没有这样的操作!");
                        break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //登录
    public static void login(PrintStream ps) {
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入登录名称：");
        String name = sc.nextLine();

        // 100: 表示登陆
        ps.println("100");
        ps.println(name);
        ps.flush();

    }

    //注册
    private static void register(PrintStream ps) {

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入注册用户名称(首字母为a-z或者A-Z,其他部分可以为字母、数字下划线，长度在10个字符以内):");
        String name = sc.nextLine();
        //调用 用户名
        name = nameJudge(name);
        System.out.println("请输入注册性别：");
        String sex = sc.nextLine();
        //判断性别  只有男或女  能通过
        sex = sexJudge(sex);
        System.out.println("请输入注册用户年龄：");
        //判断年龄  范围1-150
        String age = sc.nextLine();
        age = ageJudge(age);

        //101 表示注册
        ps.println("101");
        ps.println(name + "," + sex + "," + age);
        ps.flush();
    }

    // 单聊
    private static void sendOne(PrintStream ps) {
        System.out.println("进入单聊");
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入对方姓名：");
        String destName = sc.nextLine();

        System.out.println("请输入消息：");
        String msg = sc.nextLine();

        // 200: 表示单聊
        ps.println("200");
        ps.println(destName);
        ps.println(msg);
        ps.flush();
    }

    // 群聊
    private static void sendAll(PrintStream ps) {
        System.out.println("进入群聊");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入群发信息：");
        String msg = sc.nextLine();
        // 201: 表示群聊
        ps.println("201");
        ps.println(msg);
        ps.flush();
    }

    //随机聊
    public static void sendRandom(PrintStream ps) {
        System.out.println("请输入消息,将会随机发送给一个用户：");
        Scanner sc = new Scanner(System.in);
        String msg = sc.nextLine();
        ps.println("202");
        ps.println(msg);
        ps.flush();
    }


    //获取所有在线用户
    public static void getAllOnlineUser(PrintStream ps) {
        //300: 表示获取所有在线用户
        System.out.println("正在获取所有的用户信息");
        ps.println("300");
        ps.flush();

    }

    //获取所有在线用户根据用户名进行升序排序
    public static void getOnlineUserAscByUsername(PrintStream ps) {
        //301: 表示获取所有在线用户根据用户名进行升序排序
        System.out.println("开始进行姓名对所有上线用户排序：");
        ps.println("301");
        ps.flush();
    }

    //获取指定性别在线用户
    public static void getOnlineUserBySex(PrintStream ps) {
        while (true){
            System.out.println("请输入性别");
            Scanner sc = new Scanner(System.in);
            String sex = sc.nextLine();
            if ("男".equals(sex)||"女".equals(sex)){
                //302: 表示获取指定性别在线用户
                ps.println("302");
                ps.println(sex);
                ps.flush();
                break;
            }else {
                System.out.println("您输入的性别格式错误，请重新输入");
            }
        }

    }






    //姓名判断
    public static String nameJudge(String name) {
        if ((name.charAt(0) >= 'a' && name.charAt(0) <= 'z') || (name.charAt(0) >= 'A' && name.charAt(0) <= 'Z')) {
        } else {
            System.out.println("您输入的用户名不符合要求,请重新输入!");
            Scanner sc = new Scanner(System.in);
            String line = sc.nextLine();
            nameJudge(line);
        }
        return name;
    }

    //性别判断
    public static String sexJudge(String sex) {
        if ("女".equals(sex) || "男".equals(sex)) {

        } else {
            System.out.println("请重新输入性别");
            Scanner sc = new Scanner(System.in);
            String line = sc.nextLine();
            sexJudge(line);
        }
        return sex;
    }

    //年龄判断
    public static String ageJudge(String age) {
        Scanner sc = new Scanner(System.in);
        int length = age.length();
        if (length > 3) {
            System.out.println("请重新请输入年龄");
            String line = sc.nextLine();
            return ageJudge(line);
        } else if (length == 3) {
            if ((age.matches("[1][0-4][0-9]"))||"150".equals(age)) {
                return age;
            } else {
                System.out.println("请重新请输入年龄");
                String line = sc.nextLine();
                return ageJudge(line);
            }
        } else if (length == 2) {
            if (age.matches("[1-9][0-9]")) {
                return age;
            } else {
                System.out.println("请重新请输入年龄");
                String line = sc.nextLine();
                return ageJudge(line);
            }
        } else {
            if (age.matches("[1-9]")) {
                return age;
            } else {
                System.out.println("请重新请输入年龄");
                String line = sc.nextLine();
                return ageJudge(line);
            }
        }
    }
}
